package com.killer_jin.core.common.util.dynamicProxy;

import com.killer_jin.core.common.util.dynamicProxy.cglib.CglibProxyInterfaceDemo;
import com.killer_jin.core.common.util.dynamicProxy.cglib.CglibProxyInterfaceDemoImpl;
import com.killer_jin.core.common.util.dynamicProxy.cglib.CglibProxyInterfaceDemoProxy;
import com.killer_jin.core.common.util.dynamicProxy.jdk.JdkProxyInterfaceDemo;
import com.killer_jin.core.common.util.dynamicProxy.jdk.JdkProxyInterfaceDemoImpl;
import com.killer_jin.core.common.util.dynamicProxy.jdk.JdkProxyInterfaceDemoProxy;
import org.junit.Test;

// 动态代理测试类.https://www.cnblogs.com/ygj0930/p/6542259.html
// 1、JDK原生动态代理时java原声支持的、不需要任何外部依赖、但是它只能基于接口进行代理（因为它已经继承了proxy了，java不支持多继承）
// 2、CGLIB通过继承的方式进行代理、无论目标对象没有没实现接口都可以代理，但是无法处理final的情况（final修饰的方法不能被覆写）
public class TestDynamicProxy {

    @Test
    public void testJdkDynamicProxy() {
        // 调用代理类的bind方法,并向下强转为实际的接口的类型,注意这里必须强转为接口
        JdkProxyInterfaceDemo bind = (JdkProxyInterfaceDemo)new JdkProxyInterfaceDemoProxy().bind(new JdkProxyInterfaceDemoImpl());
        bind.eat();
    }

    @Test
    public void testCglibDynamicProxy() {
        // 调用代理类的bind方法,并向下强转为实际的实现类的类型,注意这里可以使接口也可以只是实现类,接口是不必要的
        //CglibProxyInterfaceDemo bind = (CglibProxyInterfaceDemo)new CglibProxyInterfaceDemoProxy().bind(new CglibProxyInterfaceDemoImpl());
        CglibProxyInterfaceDemoImpl bind = (CglibProxyInterfaceDemoImpl)new CglibProxyInterfaceDemoProxy().bind(new CglibProxyInterfaceDemoImpl());
        bind.eat();
    }
}
